Skip to content

Conversation

@guardrex guardrex self-assigned this Aug 14, 2025

This comment was marked as outdated.

This comment was marked as outdated.

@guardrex

This comment was marked as outdated.

This comment was marked as outdated.

@guardrex guardrex requested a review from Copilot August 14, 2025 13:00
Copilot

This comment was marked as outdated.

This comment was marked as outdated.

This comment was marked as outdated.

This comment was marked as resolved.

Copy link
Member

@MackinnonBuck MackinnonBuck left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like a great start. I'd be curious to hear what @danroth27 thinks about open questions regarding organization.

@guardrex

This comment was marked as outdated.

@guardrex

This comment was marked as outdated.

@guardrex
Copy link
Collaborator Author

guardrex commented Aug 19, 2025

🦖 NOTE TO SELF 🦖

Ask Andy to update the cross-links at https://learn.microsoft.com/dotnet/core/install/upgrade after this goes live. There will be a landing page for our Migration node articles to cross-link ...

[Migrate an ASP.NET Core app](/aspnet/core/migration/)

Recommend adding a breaking change landing page to harden the Breaking changes in .NET 9 cross-link.

The MAUI link is a problem to harden: https://github.com/dotnet/maui/wiki/Upgrading-.NET-MAUI-from-.NET-7-to-.NET-8

@guardrex
Copy link
Collaborator Author

BTW @MackinnonBuck @danroth27 ... There's a strange 👽 ".1" in the project template links these days (.../BlazorWeb-CSharp/BlazorWebCSharp.1/...). Curious on why that ".1" is there? It looks/feels temporary ... will it go away at some point?

@guardrex
Copy link
Collaborator Author

guardrex commented Aug 19, 2025

@danroth27 @MackinnonBuck ... I just converted over to ref source links in the passkeys migration article, and it will be great if framework filenames and locations will be stable.

i-like-it

I LIKE IT!

     —Emil M. Antonowsky (Paul McCrane) - RoboCop ©1987 MGM Studios/Orion Pictures

@guardrex
Copy link
Collaborator Author

guardrex commented Aug 27, 2025

@danroth27 @MackinnonBuck ... I have a coverage concept that makes sense to a 🦖 for discussion.

Given Blazor's place in .NET now, the current layout of coverage seems disorganized. RP and MVC don't have fundamentals, host and deploy, and security articles in their MVC and RP folders like Blazor does.

The pattern to consider is (in the main doc set) .....

  • Feature folder
    • Overview
    • Separate UI stack articles with pivots between greenfield and existing app implementation coverage

For passkeys, we don't have coverage for RP/MVC yet, but it goes like this (assuming that one day we have RP/MVC coverage) ...

  • Passkeys
    • Overview - Introductory remarks, Identity-level configuration, common process/code/tasks, etc.
    • Blazor - Pivoting between creating a new Identity-enabled BWA and implementing into an existing BWA
    • RP/MVC - Same pivot setup

Other subjects (Account confirmation and password recovery, TOTP/QR codes) could follow the same pattern.

Alternatively ... split coverage for passkeys goes like this ..........

  • Main doc set security node
    • Authentication
      • Identity
        • Passkeys article (the overview on the PR now)
  • Blazor security node
    • Blazor passkeys article (+pivot for greenfield/existing apps)

The latest commit puts my concept in place for passkeys to see how it composes. I look forward to hearing back either way.👂

@guardrex
Copy link
Collaborator Author

guardrex commented Aug 27, 2025

@MackinnonBuck ... Is the "Update Identity schema version" guidance point-in-time instructions only for when an app is migrating to .NET 10, or is that general guidance for all future releases?

Same ❓ for the "Create and run a database migration" step ... that seems point-in-time only for migration to .NET 10.

@guardrex
Copy link
Collaborator Author

guardrex commented Sep 3, 2025

I still need PU feedback on this ...

Please help as soon as you can. We have a lot of ToC churn, and the PRs start stepping on each other when they sit for long periods of time.

Copy link
Contributor

@mikekistler mikekistler left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks great! 👍

I left a few comments though at some point I realized that the ref docs links were intentionally omitted, so maybe those comments can just be ignored. All the others were minor so resolve them as you see fit.


When an authenticator model is discovered to have security vulnerabilities, you may need to revoke affected credentials. The implementation stores the complete attestation object with each credential, including the Authenticator Attestation GUID (AAGUID), which is a 128-bit identifier indicating the key type.

**Implementation**: Extract AAGUIDs from stored attestation objects, compare against known-compromised models, and revoke affected credentials. AAGUID reliability depends on whether your app validates attestation statements.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we provide a reference for validating attestation statements?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There's already an example here that shows how to hook in custom attestation statement validation logic, but we could go further by:

  • Linking to libraries that implement attestation statement validation (such as fido2-net-lib)
  • Producing a sample that shows how a library such as fido2-net-lib can be used to add attestation statement validation to an app

@guardrex
Copy link
Collaborator Author

guardrex commented Sep 3, 2025

Sorry, @mikekistler ... No 🎲🎲 on these until GA .....

Cross reference not found: 'Microsoft.AspNetCore.Identity.IdentityPasskeyOptions*'.

They'll have to be commented out until GA. This is typical for preview API. I circle back in November to get them all set up ... here and everywhere else.

});
```

The `UserVerificationRequirement` option determines whether the authenticator must verify the user's identity (through biometric or PIN methods), while `ResidentKeyRequirement` indicates whether the credential should be discoverable, allowing authentication without first providing a username. For more information during the .NET 10 preview release period, see the [`IdentityPasskeyOptions` reference source (`dotnet/aspnetcore` GitHub repository)](https://github.com/dotnet/aspnetcore/blob/main/src/Identity/Core/src/IdentityPasskeyOptions.cs).

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A callout that "some authenticators say that user verification was completed without actually doing anything, see https://passkeys.dev/docs/reference/known-issues/#user-verification" might be worth it here?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's a bit stale (May 31, 2025), but a testing recommendation of some sort seems like the right approach. Mackinnon will advise.


* **Adding passkeys to existing accounts**: Users with password-based accounts can register passkeys as an additional authentication method.
* **Passwordless account creation**: Users can create accounts without a password by registering a passkey on account creation.
* **Passwordless sign-in**: Users can authenticate using only their passkey without entering a password.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is usernameless/WebAuthn conditional UI a supported scenario?

Copy link
Member

@MackinnonBuck MackinnonBuck Sep 5, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, although usernameless account creation and "conditional create" are not implemented in the project template at this time. However, the template does implement conditional UI for login (i.e., passkey autofill).

There's a super basic sample in the aspnetcore repo that demonstrates passwordless account creation.

@MackinnonBuck
Copy link
Member

Apologies for the delayed reply, @guardrex.

There's a strange 👽 ".1" in the project template links these days (.../BlazorWeb-CSharp/BlazorWebCSharp.1/...). Curious on why that ".1" is there? It looks/feels temporary ... will it go away at some point?

It's a convention in the templating engine that's required for certain things to work. See this comment for more info.

Generally, links to files or directories in the repo aren't guaranteed to be stable unless they're permalinks.

Is the "Update Identity schema version" guidance point-in-time instructions only for when an app is migrating to .NET 10, or is that general guidance for all future releases?

Only when the app is upgrading to .NET 10. The latest project templates already have the correct migrations and Identity store schema version configured out of the box.

Same ❓ for the "Create and run a database migration" step ... that seems point-in-time only for migration to .NET 10.

Yep, only applicable when upgrading to .NET 10.

@guardrex
Copy link
Collaborator Author

guardrex commented Sep 5, 2025

Thanks @MackinnonBuck ... I'll react to your feedback soon, no later than Monday morning.

@guardrex
Copy link
Collaborator Author

guardrex commented Sep 8, 2025

@MackinnonBuck ...

New dev versus adding passkeys

Is the "Update Identity schema version" guidance point-in-time instructions only for when an app is migrating to .NET 10, or is that general guidance for all future releases?

Only when the app is upgrading to .NET 10. The latest project templates already have the correct migrations and Identity store schema version configured out of the box.

Same ❓ for the "Create and run a database migration" step ... that seems point-in-time only for migration to .NET 10.

Yep, only applicable when upgrading to .NET 10.

We should be fine on this point. I'm using a pivot in the Blazor article between new dev (project template) and adding passkeys to an existing app.

What's actionable on this one?

On your answer at #35943 (comment), it's not clear what part of that, if anything, should go into the guidance ... and where/how. Do you have a specific text change request?

Passkey providers that don't follow the specs

A callout that "some authenticators say that user verification was completed without actually doing anything, see https://passkeys.dev/docs/reference/known-issues/#user-verification" might be worth it here?

... not sure what's actionable on it. The linked content could easily go stale ... it might already be stale.

Permalinks versus direct links to ref source

On permalinks, that would need to be set up/requested by MS personnel for me. There are ...

  • Two links in the index.md file.
  • Nine links in the blazor.md file.

Sample that uses a lib

Producing a sample that shows how a library such as fido2-net-lib can be used to add attestation statement validation to an app

If you want to provide another sample, we can open a new issue from the bottom of the article after this is published to get that going.

Overall layout of articles

@danroth27 ...

Let me know if you prefer the split-coverage approach, where the main doc set has the passkeys overview and the Blazor-specific article goes into Blazor's security node. If you prefer that setup before I merge here, I'll move things around now. If I don't hear back in time for this PR, I'll create a new PR to move the bits around. These articles won't merge live immediately, so we have time today to sort this out.

@MackinnonBuck
Copy link
Member

On your answer at #35943 (comment), it's not clear what part of that, if anything, should go into the guidance ... and where/how. Do you have a specific text change request?

I don't think this needs to go into the guidance.

A callout that "some authenticators say that user verification was completed without actually doing anything, see https://passkeys.dev/docs/reference/known-issues/#user-verification" might be worth it here?

... not sure what's actionable on it. The linked content could easily go stale ... it might already be stale.

We could just call out that different authenticators have different behavior when it comes to fulfilling the User Verification requirement, and if you want to disallow specific authenticators from being used, you can implement attestation statement validation. I don't think it hurts to link to that external table, but I'm also not sure what policies we have (if any) on doing so.

On permalinks, that would need to be set up/requested by MS personnel for me.

On GitHub, you can get a permalink to the file by doing this:

image

If you want to provide another sample, we can open a new issue from the bottom of the article after this is published to get that going.

That would be great 🙂

@guardrex
Copy link
Collaborator Author

guardrex commented Sep 8, 2025

Thanks, @MackinnonBuck! Over eight years here, and that permalink feature was unknown to me. Learn something new everyday around here! 🧑‍🏫 I'll get this wrapped up and merged. If Dan wants the split coverage layout, I'll place that later on a separate PR. I need to move on to the final push on RC1 updates.

BTW ... Now that I think about it, I guess what confused me was "permalink" versus "aka" links ... the "aka" links are the ones that I can't create/request myself. However, I wasn't aware of the permalink feature, so thanks for that tidbit.

Permalinks aren't going to work for our links here. We must link to main to cover changes in the codebase over time (releases). We link to the current work for the next release, and we place an INCLUDES NOTE to explain how to reach the correct version of the code. We don't want to permanently link to any given code state.

I'm also not sure what policies we have (if any) on doing so.

It's a bit scary 🎃 to cross-link such content. We're trusting that they're correct in the first place, and then we're trusting that they'll keep their table up to date ... even then, we're risking that they'll keep the table/keep it in the same place or redirect when moving it. I defer to @danroth27 to decide in this case if it's worth the risks.

@guardrex guardrex merged commit a2a2df6 into main Sep 8, 2025
3 checks passed
@guardrex guardrex deleted the guardrex/blazor-passkeys branch September 8, 2025 17:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Pre7] Passkeys coverage

5 participants